home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / gnu / gcc_260.zip / gcc_260 / cp / errfn.c < prev    next >
C/C++ Source or Header  |  1994-05-19  |  5KB  |  218 lines

  1. /* Provide a call-back mechanism for handling error output.
  2.    Copyright (C) 1993 Free Software Foundation, Inc.
  3.    Contributed by Jason Merrill (jason@cygnus.com)
  4.  
  5.    This file is part of GNU CC.
  6.  
  7. GNU CC is free software; you can redistribute it and/or modify
  8. it under the terms of the GNU General Public License as published by
  9. the Free Software Foundation; either version 2, or (at your option)
  10. any later version.
  11.  
  12. GNU CC is distributed in the hope that it will be useful,
  13. but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15. GNU General Public License for more details.
  16.  
  17. You should have received a copy of the GNU General Public License
  18. along with GNU CC; see the file COPYING.  If not, write to
  19. the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  20.    
  21. #include "config.h"
  22. #include "tree.h"
  23. #include <ctype.h>
  24.  
  25. /* cp_printer is the type of a function which converts an argument into
  26.    a string for digestion by printf.  The cp_printer function should deal
  27.    with all memory management; the functions in this file will not free
  28.    the char*s returned.  See error.c for an example use of this code.  */
  29.  
  30. typedef char* cp_printer PROTO((HOST_WIDE_INT, int));
  31. extern cp_printer * cp_printers[256];
  32.  
  33. typedef void errorfn ();    /* deliberately vague */
  34.  
  35. extern char* cp_file_of PROTO((tree));
  36. extern int   cp_line_of PROTO((tree));
  37.  
  38. #define STRDUP(f) (ap = (char *) alloca (strlen (f) +1), strcpy (ap, (f)), ap)
  39.  
  40. #define NARGS 3
  41. #define arglist a1, a2, a3
  42. #define arglist_dcl HOST_WIDE_INT a1, a2, a3;
  43. #define ARGSINIT args[0] = a1; args[1] = a2; args[2] = a3;
  44. #define ARGSLIST args[0], args[1], args[2]
  45.  
  46. static void
  47. cp_thing (errfn, atarg1, format, arglist)
  48.      errorfn *errfn;
  49.      int atarg1;
  50.      char *format;
  51.      arglist_dcl
  52. {
  53.   char *fmt;
  54.   char *f;
  55.   char *ap;
  56.   int arg;
  57.   HOST_WIDE_INT atarg = atarg1 ? a1 : 0;
  58.   HOST_WIDE_INT args[NARGS];
  59.   ARGSINIT
  60.  
  61.   fmt = STRDUP(format);
  62.   
  63.   for (f = fmt, arg = 0; *f; ++f)
  64.     {
  65.       cp_printer * function;
  66.       int alternate;
  67.       int maybe_here;
  68.       
  69.       /* ignore text */
  70.       if (*f != '%') continue;
  71.  
  72.       ++f;
  73.  
  74.       alternate = 0;
  75.       maybe_here = 0;
  76.  
  77.       /* ignore most flags */
  78.       while (*f == ' ' || *f == '-' || *f == '+' || *f == '#')
  79.     {
  80.       if (*f == '+')
  81.         maybe_here = 1;
  82.       else if (*f == '#')
  83.         alternate = 1;
  84.       ++f;
  85.     }
  86.  
  87.       /* ignore field width */
  88.       if (*f == '*')
  89.     {
  90.       ++f;
  91.       ++arg;
  92.     }
  93.       else
  94.     while (isdigit (*f))
  95.       ++f;
  96.  
  97.       /* ignore precision */
  98.       if (*f == '.')
  99.     {
  100.       ++f;
  101.       if (*f == '*')
  102.         {
  103.           ++f;
  104.           ++arg;
  105.         }
  106.       else
  107.         while (isdigit (*f))
  108.           ++f;
  109.     }
  110.  
  111.       /* ignore "long" */
  112.       if (*f == 'l')
  113.     ++f;
  114.  
  115.       function = cp_printers[(int)*f];
  116.  
  117.       if (function)
  118.     {
  119.       char *p;
  120.  
  121.       if (arg >= NARGS) abort ();
  122.       
  123.       if (maybe_here && atarg1)
  124.         atarg = args[arg];
  125.  
  126.       /* Must use a temporary to avoid calling *function twice */
  127.       p = (*function) (args[arg], alternate);
  128.       args[arg] = (HOST_WIDE_INT) STRDUP(p);
  129.       *f = 's';
  130.     }
  131.  
  132.       ++arg;            /* Assume valid format string */
  133.  
  134.     }
  135.  
  136.   if (atarg)
  137.     {
  138.       char *file = cp_file_of ((tree) atarg);
  139.       int   line = cp_line_of ((tree) atarg);
  140.       (*errfn) (file, line, fmt, ARGSLIST);
  141.     }
  142.   else
  143.     (*errfn) (fmt, ARGSLIST);
  144.  
  145. }
  146.  
  147. void
  148. cp_error (format, arglist)
  149.      char *format;
  150.      arglist_dcl
  151. {
  152.   extern errorfn error;
  153.   cp_thing (error, 0, format, arglist);
  154. }
  155.  
  156. void
  157. cp_warning (format, arglist)
  158.      char *format;
  159.      arglist_dcl
  160. {
  161.   extern errorfn warning;
  162.   cp_thing (warning, 0, format, arglist);
  163. }
  164.  
  165. void
  166. cp_pedwarn (format, arglist)
  167.      char *format;
  168.      arglist_dcl
  169. {
  170.   extern errorfn pedwarn;
  171.   cp_thing (pedwarn, 0, format, arglist);
  172. }
  173.  
  174. void
  175. cp_compiler_error (format, arglist)
  176.      char *format;
  177.      arglist_dcl
  178. {
  179.   extern errorfn compiler_error;
  180.   cp_thing (compiler_error, 0, format, arglist);
  181. }
  182.  
  183. void
  184. cp_sprintf (format, arglist)
  185.      char *format;
  186.      arglist_dcl
  187. {
  188.   extern errorfn sprintf;
  189.   cp_thing (sprintf, 0, format, arglist);
  190. }
  191.  
  192. void
  193. cp_error_at (format, arglist)
  194.      char *format;
  195.      arglist_dcl
  196. {
  197.   extern errorfn error_with_file_and_line;
  198.   cp_thing (error_with_file_and_line, 1, format, arglist);
  199. }
  200.  
  201. void
  202. cp_warning_at (format, arglist)
  203.      char *format;
  204.      arglist_dcl
  205. {
  206.   extern errorfn warning_with_file_and_line;
  207.   cp_thing (warning_with_file_and_line, 1, format, arglist);
  208. }
  209.  
  210. void
  211. cp_pedwarn_at (format, arglist)
  212.      char *format;
  213.      arglist_dcl
  214. {
  215.   extern errorfn pedwarn_with_file_and_line;
  216.   cp_thing (pedwarn_with_file_and_line, 1, format, arglist);
  217. }
  218.